package starcafe;

import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Map.Entry;

/**
 * Gere la connection des utilisateurs
 * @author a.delevaux
 *
 */
public class PoolConnection {

	
	public void connecter(Connection conn, String ident,String mdp) throws RemoteException{
		try {
			Statement stat = conn.createStatement();
			ResultSet rs = stat.executeQuery("SELECT IdClient, Ident, Nom, Prenom, Admin FROM CLIENT WHERE ident='"+ident+"' AND mdp='"+mdp+"'");
			//S'il n'y a pas de resultat
			if (!rs.isClosed()){
				InfoUtilOnline info = new InfoUtilOnline(
						rs.getInt("IdClient"), rs.getString("Ident"),
						rs.getString("Nom"), rs.getString("Prenom"), (rs.getString("Admin").equalsIgnoreCase("Y")));
				pool.put(info.getIdent(), info);
				rs.next();
				rs.close();
			}else{
				rs.close();
				throw new RemoteException("Utilisateur invalide."); 
			}
		} catch (SQLException e) {
			throw new RemoteException(e.getMessage()); 
		}
	}
	
	public void deconnecter(String ident) throws RemoteException{
		//pas connecter --> Erreur
		if (!estConnecter(ident)){
			throw new IndexOutOfBoundsException("L'utilisateur "+ident+" n'est pas en ligne");
		}
		pool.remove(ident);
	}
	
	/**
	 * Indique si cet utilisateur est connecte
	 * @param user
	 * @return
	 */
	public boolean estConnecter(String user){
		return pool.containsKey(user);
	}
	
	/**
	 * Retourne les info sur l'utilisateur
	 * @param user
	 * @return 
	 */
	public InfoUtilOnline getInfoUser(String user){
		//pas connecter --> Erreur
		if (!estConnecter(user)){
			throw new IndexOutOfBoundsException("L'utilisateur "+user+" n'est pas en ligne");
		}
		return pool.get(user);
	}
	
	/**
	 * Retourne l'etat du pool de connection
	 * @return
	 */
	public List<InfoUtilOnline> getUtilOnline(){
		List<InfoUtilOnline> result = new ArrayList<InfoUtilOnline>();
		
		for(Entry<String, InfoUtilOnline> info : pool.entrySet()){
			result.add(info.getValue());
		}
		return result;
	}
	
	/**
	 * Support de realisation pour le pool
	 */
	private Map<String,InfoUtilOnline> pool = new HashMap<String,InfoUtilOnline>();
	
}
